from abc import ABC, abstractmethod
from typing import Dict, Any, List, Optional, Union, Callable

class BaseModel(ABC):
    """AI模型基类，定义了所有模型必须实现的接口"""
    
    @abstractmethod
    def __init__(self, api_key: str, model_name: str):
        self.api_key = api_key
        self.model_name = model_name
        self.api_url = ""
        self.supports_thinking = False
        self.supports_streaming = False  # 是否支持流式输出
    
    @abstractmethod
    def generate_response(self, messages: List[Dict[str, str]], enable_thinking: bool = False) -> Union[str, Dict[str, str]]:
        """生成响应（阻塞模式）
        
        Args:
            messages: 消息历史列表
            enable_thinking: 是否启用深度思考
            
        Returns:
            如果支持深度思考且启用，返回 {"thinking": str, "response": str}
            否则返回响应字符串
        """
        pass
    
    def generate_response_stream(self, messages: List[Dict[str, str]], 
                               callback: Callable[[str], None],
                               enable_thinking: bool = False) -> None:
        """生成流式响应（非阻塞模式）
        
        Args:
            messages: 消息历史列表
            callback: 每收到一个token时的回调函数
            enable_thinking: 是否启用深度思考
        """
        # 默认实现：调用阻塞模式，然后模拟流式输出
        response = self.generate_response(messages, enable_thinking)
        if isinstance(response, dict):
            content = response.get('response', '')
        else:
            content = response
        
        # 模拟流式输出（每100毫秒输出一个字符）
        import time
        for char in content:
            callback(char)
            time.sleep(0.1)